﻿#include "TP8.h"

using namespace std;

//debouncer
int librobot::button_pressed(uint8_t ms){
	if(!bit_is_clear(BUTTON_PIN, BUTTON)){
		while(ms--){
			_delay_ms(1);
		}
		if(!bit_is_clear(BUTTON_PIN, BUTTON)) return 1;
	}
	return 0;
}

//permet d'afficher une led en ambré durant 4ms
void librobot::affiche_ambre(){
	output_high(PORTB, LED_R);
	_delay_ms(2);
	output_low(PORTB, LED_R);
	output_high(PORTB, LED_V);
	_delay_ms(2);
	output_low(PORTB, LED_V);
}

void librobot::pwm(int freq, int ratio, int delay, uint8_t pin){
	
	int delay_high_us = (10*ratio)/freq;
	int delay_low_us = 1000/freq - delay_high_us;
	int i,j;
	
	for(j=0;j<(delay*freq)/1000;j++){
		
		output_high(PORTB, pin);

		for(i=0; i<delay_high_us; i++) { 
			_delay_ms(1); 	
		}   
		
		output_low(PORTB, pin);
		for(i=0; i<delay_low_us; i++){ 
			_delay_ms(1); 	
		}
	}
}

void librobot::partirMinuterie ( uint16_t duree )
{

minuterieExpiree = 0;

// mode CTC du timer 1 avec horloge divisee par 1024

// interruption après la duree specifiee

TCNT1 = 0 ;

OCR1A = duree;

TCCR1A = _BV(COM1A0);

TCCR1B =  _BV(CS10) ;
TCCR1B =  _BV(CS12) ;

TIMSK1 =  _BV(OCIE1A) ;


}

void librobot::initialisation () {
	// cli est une routine qui bloque toutes les interruptions.
	cli ();
	
	// configurer et choisir les ports pour les entrees
	// et les sorties. DDRx... Initialisez bien vos variables
	set_input(DDRD,PD2);
	
	set_output(DDRB,PB0);
	set_output(DDRB,PB1);
	
	//autorise interruptions externes sur INT0
	EIMSK |= _BV(INT0);

	// sensible au falling edge (passage à 0) sur INT0
	EICRA |= _BV(ISC01);

	// sei permet de recevoir a nouveau des interruptions.
	sei ();
}

void librobot::myDelay(int length){
        for(int i=0; i<length; i++){
                _delay_ms(1);
        }
}

// Fonction a appeler une fois si on utilise l'UART0
void librobot::initialisationUART ( void ) {
// 2400 bauds. Nous vous donnons la valeur des deux
// premier registres pour vous éviter des complications
UBRR0H = 0;
UBRR0L = 0xCF;
        
// permettre la reception et la transmission par le UART0
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
// Format des trames: 8 bits, 1 stop bits, none parity
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

// Fonction pour recevoir des données de UART0
char librobot::receptionUART(){
        while ((UCSR0A & (1 << RXC0)) == 0) {}; 
        return UDR0;    
}

// Fonction pour envoyer des donn�es via UART0
void librobot::transmissionUART( char donnee ) {
        while ((UCSR0A & (1 << UDRE0)) == 0) {}; 
        UDR0 = donnee; 
}